home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 32 / CD Expert nº 32.iso / Army Men TiS / data1.cab / Required_Files / rules / node_ai.txt < prev    next >
Text File  |  1999-10-08  |  15KB  |  457 lines

  1. // these macros get expanded on the host if the @1 army is AI controlled
  2.  
  3. // Summary of node control AI approach is this:
  4. //
  5. // At startup, randomly pick one of these actions:
  6. // 1. send sarge and group 1 to nearest non-owned node to sarge, send group 2, 4 and 6 to
  7. //    second nearest non-owned node to sarge and send group 3, 5 and 7 to third nearest
  8. //    non-owned node.
  9. // 2. send sarge and group 1, 4, 5 to nearest non-owned node to sarge and send groups
  10. //    2, 3, 6, 7 to second closest non-owned node to sarge
  11. // 3. send sarge and all groups to nearest non-owned node to sarge
  12. // When choosing a new action, it depends on the number of nodes owned by my team plus
  13. // whether my team is winning the game.
  14. // Depending on these plus random calls we select one of above actions or one of the
  15. // following:
  16. // 4. send sarge and group1 to nearest non-owned node to sarge,
  17. //    send group 2,4,6 to closest owned node to sarge,
  18. //    send group 3,5,7 to second closest non-owned node to sarge
  19. // 5. send sarge and group1 to nearest non-owned node to sarge,
  20. //    send group 2,4,6 to closest owned node to sarge,
  21. //    send group 3,5,7 to second closest owned node to sarge
  22. // 6. send sarge and group1 to nearest owned node to sarge,
  23. //    send group 2,4,6 to second closest owned node to sarge,
  24. //    send group 3,5,7 to third closest owned node to sarge
  25. // 7. send sarge and group 1, 3, 5, 7 to nearest owned node to sarge,
  26. //    send group 2,4,6 to second closest owned node to sarge,
  27. //
  28. // The rules for selecting amoung these actions are:
  29. // if we own no nodes then
  30. //    randomly pick from 1, 2, 3
  31. // else if we own one node only then
  32. //    randomly pick from 4, 1, 2, 3
  33. // else if we own two nodes and are winning then
  34. //    randomly pick from 5, 4, 7
  35. // else if we own two nodes and are not winning then
  36. //    randomly pick from 1, 2, 3, 4, 5
  37. // else if we own three nodes or more and are winning
  38. //    pick action 6
  39. // else if we own three nodes or more and are not winning
  40. //    pick option 5
  41.  
  42. // @1 = color of army to do AI for, @2 = enemy color, @3 = enemy color number
  43. macro ai_score_compare_enemy 3
  44. {
  45.     if @1check@2score testvar teamscore @2 >= @1winningScore and IsAlly @1 @2 = 0 then
  46.         setvar @1winningScore teamscore @2,
  47.         setvar @1winningColor @3
  48. }
  49.  
  50. // @1 = color of army to do AI for, @2-4 = enemy colors
  51. macro ai_score_compare 4
  52. {
  53.     // this variable is set to the winning score if @1 is not winning
  54.     variable @1winningScore 0
  55.  
  56.     // this variable is set to the winning color (e.g. green, tan) if @1 is not winning
  57.     variable @1winningColor 0
  58.  
  59.     expand ai_score_compare_enemy ( @1 @2 1 )
  60.     expand ai_score_compare_enemy ( @1 @3 2 )
  61.     expand ai_score_compare_enemy ( @1 @4 3 )
  62.  
  63.     if @1CalculateWinningTeam then
  64.         setvar @1winningScore 0,
  65.         setvar @1winningColor 0,
  66.         trigger @1check@2score,
  67.         trigger @1check@3score,
  68.         trigger @1check@4score
  69. }
  70.  
  71. // @1 = color of army to do AI for,
  72. // @2 = a node number, @3 = a group number
  73. macro node_ai_per_node_per_group 3
  74. {
  75.     if @1GroupGotoNode testvar @1gotoNode = @2 and @1gotoGroup = @3 then
  76.         order @1 group @3 goto @1node@2pad inmode defend
  77. }
  78.  
  79. // @1 = color of army to do AI for,
  80. // @2 = a node number
  81. // @3 = owner number for this color
  82. macro node_ai_per_node 3
  83. {
  84.     expand node_ai_per_node_per_group ( @1 @2 0 )
  85.     expand node_ai_per_node_per_group ( @1 @2 1 )
  86.     expand node_ai_per_node_per_group ( @1 @2 2 )
  87.     expand node_ai_per_node_per_group ( @1 @2 3 )
  88.     expand node_ai_per_node_per_group ( @1 @2 4 )
  89.     expand node_ai_per_node_per_group ( @1 @2 5 )
  90.     expand node_ai_per_node_per_group ( @1 @2 6 )
  91.     expand node_ai_per_node_per_group ( @1 @2 7 )
  92.  
  93.     if @1SargeGotoNode testvar @1gotoNode = @2 then
  94.         order @1sarge1 goto @1node@2pad inmode attack
  95.  
  96.     // if any node changes owner then reconsider our actions
  97.     if node@2OwnerChanged then
  98.         triggerdelay 200 @1ChooseNewAction
  99.  
  100.     // stuff for working out closest owned/non-owned nodes
  101.     variable @1TeamOwnsNode@2 0
  102.  
  103.     if @1ClearTeamOwns then
  104.         setvar @1TeamOwnsNode@2 0
  105.  
  106.     if @1CalcTeamOwns testvar node@2owner = @3 then
  107.         setvar @1TeamOwnsNode@2 1
  108.  
  109.     if @1FindClosest1OwnedNode
  110.     testvar @1TeamOwnsNode@2 = 1
  111.     and @1Closest1OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  112.         setvar @1Closest1OwnedNode @2,
  113.         setvar @1Closest1OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  114.  
  115.     if @1FindClosest2OwnedNode
  116.     testvar @1TeamOwnsNode@2 = 1
  117.     and @2 <> @1Closest1OwnedNode
  118.     and @1Closest2OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  119.         setvar @1Closest2OwnedNode @2,
  120.         setvar @1Closest2OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  121.  
  122.     if @1FindClosest3OwnedNode
  123.     testvar @1TeamOwnsNode@2 = 1
  124.     and @2 <> @1Closest1OwnedNode
  125.     and @2 <> @1Closest2OwnedNode
  126.     and @1Closest3OwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  127.         setvar @1Closest3OwnedNode @2,
  128.         setvar @1Closest3OwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  129.  
  130.     if @1FindClosest1NonOwnedNode
  131.     testvar @1TeamOwnsNode@2 = 0
  132.     and @1Closest1NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  133.         setvar @1Closest1NonOwnedNode @2,
  134.         setvar @1Closest1NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  135.  
  136.     if @1FindClosest2NonOwnedNode
  137.     testvar @1TeamOwnsNode@2 = 0
  138.     and @2 <> @1Closest1NonOwnedNode
  139.     and @1Closest2NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  140.         setvar @1Closest2NonOwnedNode @2,
  141.         setvar @1Closest2NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  142.  
  143.     if @1FindClosest3NonOwnedNode
  144.     testvar @1TeamOwnsNode@2 = 0
  145.     and @2 <> @1Closest1NonOwnedNode
  146.     and @2 <> @1Closest2NonOwnedNode
  147.     and @1Closest3NonOwnedNodeDist > ItemToPadDistance @1sarge1 @1node@2pad then
  148.         setvar @1Closest3NonOwnedNode @2,
  149.         setvar @1Closest3NonOwnedNodeDist ItemToPadDistance @1sarge1 @1node@2pad
  150. }
  151.  
  152. // @1 = color of army to do AI for, @2 = enemy color,
  153. // @3 = this colors owner number, @4 = enemy colors owner numbers
  154. // @5 = node number
  155. macro node_ai_per_enemy_per_node 5
  156. {
  157.     if @1CalcTeamOwns testvar isAlly @1 @2 = 1 and node@5owner = @4 then
  158.         setvar @1TeamOwnsNode@5 1
  159. }
  160.  
  161. // @1 = color of army to do AI for, @2 = enemy color,
  162. // @3 = this colors owner number, @4 = enemy colors owner numbers
  163. // @5 = action number for attacking this enemy
  164. macro node_ai_per_enemy 5
  165. {
  166.     expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 1 )
  167.     expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 2 )
  168.     expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 3 )
  169.     expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 4 )
  170.     expand node_ai_per_enemy_per_node ( @1 @2 @3 @4 5 )
  171. }
  172.  
  173. // @1 = color of army to do AI for, @2-@4 = other colors,
  174. // @5 = this colors owner number, @6-8 = other colors owner numbers
  175. macro node_ai_macro 8
  176. {
  177.     expand ai_score_compare ( @1 @2 @3 @4 )
  178.  
  179.     // calculate the closest owned and unowned nodes
  180.     variable @1Closest1OwnedNode 0
  181.     variable @1Closest2OwnedNode 0
  182.     variable @1Closest3OwnedNode 0
  183.     variable @1Closest1NonOwnedNode 0
  184.     variable @1Closest2NonOwnedNode 0
  185.     variable @1Closest3NonOwnedNode 0
  186.     variable @1Closest1OwnedNodeDist 10000
  187.     variable @1Closest2OwnedNodeDist 10000
  188.     variable @1Closest3OwnedNodeDist 10000
  189.     variable @1Closest1NonOwnedNodeDist 10000
  190.     variable @1Closest2NonOwnedNodeDist 10000
  191.     variable @1Closest3NonOwnedNodeDist 10000
  192.  
  193.     if @1CalculateClosestNodes then
  194.         trigger @1ClearTeamOwns,
  195.         trigger @1CalcTeamOwns,
  196.         setvar @1Closest1OwnedNode 0,
  197.         setvar @1Closest2OwnedNode 0,
  198.         setvar @1Closest3OwnedNode 0,
  199.         setvar @1Closest1NonOwnedNode 0,
  200.         setvar @1Closest2NonOwnedNode 0,
  201.         setvar @1Closest3NonOwnedNode 0,
  202.         setvar @1Closest1OwnedNodeDist 10000,
  203.         setvar @1Closest2OwnedNodeDist 10000,
  204.         setvar @1Closest3OwnedNodeDist 10000,
  205.         setvar @1Closest1NonOwnedNodeDist 10000,
  206.         setvar @1Closest2NonOwnedNodeDist 10000,
  207.         setvar @1Closest3NonOwnedNodeDist 10000,
  208.         trigger @1FindClosest1OwnedNode,
  209.         trigger @1FindClosest2OwnedNode,
  210.         trigger @1FindClosest3OwnedNode,
  211.         trigger @1FindClosest1NonOwnedNode,
  212.         trigger @1FindClosest2NonOwnedNode,
  213.         trigger @1FindClosest3NonOwnedNode
  214.  
  215.     // This variable holds the current action for @1
  216.     // 0 means no action, other actions are explained in header of this file
  217.     variable @1Action 0
  218.  
  219.     variable @1gotoNode 0
  220.     variable @1gotoGroup 0
  221.  
  222.     expand node_ai_per_node ( @1 1 @5 )
  223.     expand node_ai_per_node ( @1 2 @5 )
  224.     expand node_ai_per_node ( @1 3 @5 )
  225.     expand node_ai_per_node ( @1 4 @5 )
  226.     expand node_ai_per_node ( @1 5 @5 )
  227.  
  228.     expand node_ai_per_enemy ( @1 @2 @5 @6 4 )
  229.     expand node_ai_per_enemy ( @1 @3 @5 @7 5 )
  230.     expand node_ai_per_enemy ( @1 @4 @5 @8 6 )
  231.  
  232.     if startup1 then
  233.         triggerdelay 1000 @1ChooseNewAction
  234.  
  235.     // events to choose an action based on who owns what and who is winning
  236.  
  237.     if @1ChooseNewAction then
  238.         setvar @1Action 0,
  239.         trigger @1CalculateWinningTeam,
  240.         trigger @1ChooseAction,
  241.         trigger @1PerformAction,
  242.         trigger @1StartTimeOut
  243.  
  244.     if @1ChooseAction testvar @1nodesOwned = 0 then random
  245.         setvar @1Action 1,
  246.         setvar @1Action 2,
  247.         setvar @1Action 3
  248.  
  249.     if @1ChooseAction testvar @1nodesOwned = 1 then random
  250.         setvar @1Action 4,
  251.         setvar @1Action 1,
  252.         setvar @1Action 2,
  253.         setvar @1Action 3
  254.  
  255.     if @1ChooseAction testvar @1nodesOwned = 2
  256.     and @1winningscore < teamscore @1 then random
  257.         setvar @1Action 4,
  258.         setvar @1Action 5,
  259.         setvar @1Action 6,
  260.         setvar @1Action 7
  261.  
  262.     if @1ChooseAction testvar @1nodesOwned = 2
  263.     and @1winningscore >= teamscore @1 then random
  264.         setvar @1Action 1,
  265.         setvar @1Action 2,
  266.         setvar @1Action 3,
  267.         setvar @1Action 4,
  268.         setvar @1Action 5
  269.  
  270.     if @1ChooseAction testvar @1nodesOwned >= 3
  271.     and @1winningscore < teamscore @1 then random
  272.         setvar @1Action 6
  273.  
  274.     if @1ChooseAction testvar @1nodesOwned >= 3
  275.     and @1winningscore >= teamscore @1 then random
  276.         setvar @1Action 5
  277.  
  278.     // events to perform the chosen action
  279.  
  280.     if @1PerformAction testvar @1Action = 0 then
  281.         triggerdelay 3000 @1ChooseNewAction
  282.  
  283.     if @1PerformAction testvar @1Action = 1 then
  284.         trigger @1CalculateClosestNodes,
  285.         // sarge and 1 to closest non-owned node
  286.         setvar @1gotoNode @1Closest1NonOwnedNode,
  287.         trigger @1SargeGotoNode,
  288.         setvar @1gotoGroup 1,
  289.         trigger @1GroupGotoNode,
  290.         // 2, 4, 6 to second closest non-owned node
  291.         setvar @1gotoNode @1Closest2NonOwnedNode,
  292.         setvar @1gotoGroup 2,
  293.         trigger @1GroupGotoNode,
  294.         setvar @1gotoGroup 4,
  295.         trigger @1GroupGotoNode,
  296.         setvar @1gotoGroup 6,
  297.         trigger @1GroupGotoNode,
  298.         // 3, 5, 7 to third closest non-owned node
  299.         setvar @1gotoNode @1Closest3NonOwnedNode,
  300.         setvar @1gotoGroup 3,
  301.         trigger @1GroupGotoNode,
  302.         setvar @1gotoGroup 5,
  303.         trigger @1GroupGotoNode,
  304.         setvar @1gotoGroup 7,
  305.         trigger @1GroupGotoNode
  306.  
  307.     if @1PerformAction testvar @1Action = 2 then
  308.         trigger @1CalculateClosestNodes,
  309.         // sarge and 1, 4, 5 to closest non-owned node
  310.         setvar @1gotoNode @1Closest1NonOwnedNode,
  311.         trigger @1SargeGotoNode,
  312.         setvar @1gotoGroup 1,
  313.         trigger @1GroupGotoNode,
  314.         setvar @1gotoGroup 4,
  315.         trigger @1GroupGotoNode,
  316.         setvar @1gotoGroup 5,
  317.         trigger @1GroupGotoNode,
  318.         // 2, 3, 6, 7 to second closest non-owned node
  319.         setvar @1gotoNode @1Closest2NonOwnedNode,
  320.         setvar @1gotoGroup 2,
  321.         trigger @1GroupGotoNode,
  322.         setvar @1gotoGroup 3,
  323.         trigger @1GroupGotoNode,
  324.         setvar @1gotoGroup 6,
  325.         trigger @1GroupGotoNode,
  326.         setvar @1gotoGroup 7,
  327.         trigger @1GroupGotoNode
  328.  
  329.     if @1PerformAction testvar @1Action = 3 then
  330.         trigger @1CalculateClosestNodes,
  331.         // sarge and 1, 2, 3, 4, 5, 6, 7 to closest non-owned node
  332.         setvar @1gotoNode @1Closest1NonOwnedNode,
  333.         trigger @1SargeGotoNode,
  334.         setvar @1gotoGroup 1,
  335.         trigger @1GroupGotoNode,
  336.         setvar @1gotoGroup 2,
  337.         trigger @1GroupGotoNode,
  338.         setvar @1gotoGroup 3,
  339.         trigger @1GroupGotoNode,
  340.         setvar @1gotoGroup 4,
  341.         trigger @1GroupGotoNode,
  342.         setvar @1gotoGroup 5,
  343.         trigger @1GroupGotoNode,
  344.         setvar @1gotoGroup 6,
  345.         trigger @1GroupGotoNode,
  346.         setvar @1gotoGroup 7,
  347.         trigger @1GroupGotoNode
  348.  
  349.     if @1PerformAction testvar @1Action = 4 then
  350.         trigger @1CalculateClosestNodes,
  351.         // sarge and 1 to closest non-owned node
  352.         setvar @1gotoNode @1Closest1NonOwnedNode,
  353.         trigger @1SargeGotoNode,
  354.         setvar @1gotoGroup 1,
  355.         trigger @1GroupGotoNode,
  356.         // 2, 4, 6 to closest owned node
  357.         setvar @1gotoNode @1Closest1OwnedNode,
  358.         setvar @1gotoGroup 2,
  359.         trigger @1GroupGotoNode,
  360.         setvar @1gotoGroup 4,
  361.         trigger @1GroupGotoNode,
  362.         setvar @1gotoGroup 6,
  363.         trigger @1GroupGotoNode,
  364.         // 3, 5, 7 to second closest non-owned node
  365.         setvar @1gotoNode @1Closest2NonOwnedNode,
  366.         setvar @1gotoGroup 3,
  367.         trigger @1GroupGotoNode,
  368.         setvar @1gotoGroup 5,
  369.         trigger @1GroupGotoNode,
  370.         setvar @1gotoGroup 7,
  371.         trigger @1GroupGotoNode
  372.  
  373.     if @1PerformAction testvar @1Action = 5 then
  374.         trigger @1CalculateClosestNodes,
  375.         // sarge and 1 to closest non-owned node
  376.         setvar @1gotoNode @1Closest1NonOwnedNode,
  377.         trigger @1SargeGotoNode,
  378.         setvar @1gotoGroup 1,
  379.         trigger @1GroupGotoNode,
  380.         // 2, 4, 6 to closest owned node
  381.         setvar @1gotoNode @1Closest1OwnedNode,
  382.         setvar @1gotoGroup 2,
  383.         trigger @1GroupGotoNode,
  384.         setvar @1gotoGroup 4,
  385.         trigger @1GroupGotoNode,
  386.         setvar @1gotoGroup 6,
  387.         trigger @1GroupGotoNode,
  388.         // 3, 5, 7 to second closest owned node
  389.         setvar @1gotoNode @1Closest2OwnedNode,
  390.         setvar @1gotoGroup 3,
  391.         trigger @1GroupGotoNode,
  392.         setvar @1gotoGroup 5,
  393.         trigger @1GroupGotoNode,
  394.         setvar @1gotoGroup 7,
  395.         trigger @1GroupGotoNode
  396.  
  397.     if @1PerformAction testvar @1Action = 6 then
  398.         trigger @1CalculateClosestNodes,
  399.         // sarge and 1 to closest owned node
  400.         setvar @1gotoNode @1Closest1OwnedNode,
  401.         trigger @1SargeGotoNode,
  402.         setvar @1gotoGroup 1,
  403.         trigger @1GroupGotoNode,
  404.         // 2, 4, 6 to second closest owned node
  405.         setvar @1gotoNode @1Closest2OwnedNode,
  406.         setvar @1gotoGroup 2,
  407.         trigger @1GroupGotoNode,
  408.         setvar @1gotoGroup 4,
  409.         trigger @1GroupGotoNode,
  410.         setvar @1gotoGroup 6,
  411.         trigger @1GroupGotoNode,
  412.         // 3, 5, 7 to third closest owned node
  413.         setvar @1gotoNode @1Closest3OwnedNode,
  414.         setvar @1gotoGroup 3,
  415.         trigger @1GroupGotoNode,
  416.         setvar @1gotoGroup 5,
  417.         trigger @1GroupGotoNode,
  418.         setvar @1gotoGroup 7,
  419.         trigger @1GroupGotoNode
  420.  
  421.     if @1PerformAction testvar @1Action = 7 then
  422.         trigger @1CalculateClosestNodes,
  423.         // sarge and 1 , 3, 5, 7 to closest owned node
  424.         setvar @1gotoNode @1Closest1OwnedNode,
  425.         trigger @1SargeGotoNode,
  426.         setvar @1gotoGroup 1,
  427.         trigger @1GroupGotoNode,
  428.         setvar @1gotoGroup 3,
  429.         trigger @1GroupGotoNode,
  430.         setvar @1gotoGroup 5,
  431.         trigger @1GroupGotoNode,
  432.         setvar @1gotoGroup 7,
  433.         trigger @1GroupGotoNode,
  434.         // 2, 4, 6 to second closest owned node
  435.         setvar @1gotoNode @1Closest2OwnedNode,
  436.         setvar @1gotoGroup 2,
  437.         trigger @1GroupGotoNode,
  438.         setvar @1gotoGroup 4,
  439.         trigger @1GroupGotoNode,
  440.         setvar @1gotoGroup 6,
  441.         trigger @1GroupGotoNode,
  442.  
  443.     // timeout code - if mode has not changed for a while then change it
  444.  
  445.     variable @1TimeOutVar 0
  446.     variable @1LastTimeOutVar 1
  447.  
  448.     if @1StartTimeOut then
  449.         addvar @1TimeOutVar 1,
  450.         triggerdelay 120000 @1CheckTimeOut
  451.  
  452.     if @1CheckTimeOut testvar @1TimeOutVar = @1LastTimeOutVar then
  453.         trigger @1ChooseNewAction
  454.  
  455.     if @1CheckTimeOut testvar @1TimeOutVar <> @1LastTimeOutVar then
  456.         addvar @1LastTimeOutVar 1
  457. }